查看原文
其他

我的微信数据监控研究发展过程

JovenHe 看雪学院 2019-09-17

以下内容适用范围:已经获取root权限的手机。


近两年来一直在做Android端微信的消息备份功能,一开始是调研自己实现,现在是公司业务需要,现已实现好友相关信息备份,监控消息、领取红包、监控发布朋友圈数据、监控朋友圈点赞回复等功能。



微信相关基本知识


1. 聊天消息表、联系人表、头像信息表、联系人标签表、红包转账信息表等都存在EnMicroMsg.db数据库中,但该数据库被加密,需要密码才能查看。


2. EnMicroMsg.d地址是/data/data/com.tencent.mm/MicroMsg/32位字符串/EnMicroMsg.db,32位字符串是通过MD5加密("mm"+uin码)得出的,如果有多个32位字符串的文件夹,说明登录过多个微信号,微信号不同,uin码不同。


同一级的还有其他数据库,比如SnsMicroMsg.db,存放的是微信朋友圈相关表,该数据库无密码,可直接查看。


3. EnMicroMsg.db的密码是MD5(imei码+uin码).substring(0, 7).toLowerCase()得到,imei码是通过获取手机IMEI码得到,uin码是微信SharedPerferences中存储的,文件位置\data\data\com.tencent.mm\shared_prefs\auth_info_key_prefs.xml,通过解析xml文件来得到"_auth_uin"字段的值。


4.当前登录微信的账号ID存放于\data\data\com.tencent.mm\shared_prefs\notify_key_pref_no_account.xml文件中,通过解析xml文件来得到"login_weixin_username"字段的值。


1静态监控

是我一开始参考网上文章后实现监控的方法,使用的是定时复制数据库,并读取的方法。


定时复制微信的数据库文件到我的文件夹下,计算得到密码后,使用sqlcipher连接并传入密码来读取数据,然后发送到服务器。


2动态监控

可以看到静态监控的方法并不完善,并不能做到实时监控,在我接触到Xposed后开始使用hook 拦截的方式来监控微信数据。


可以说微信是我反编译大厂app后发现的少数不做加固的app之一,让我省去了脱壳的步骤

这里主要对监控发布朋友圈数据进行详细教程,包含xposed的大多数使用。


1、使用当前Activity 这个app来查看发布朋友圈页面的包名和Activity。



当然也可以使用adb来查看


2、使用jadx打开微信apk,本案例使用的是6.6.7版本,搜索类SnsUploadUI




可以看到有一个SnsEditText的变量,很大把握可以确定这个变量就是发朋友圈的文本输入框。


3、找到发表按钮


看到发表按钮,可以确定它要么是一个MenuItem,要么是一个普通view,但总会有点击事件。


先查找SnsEditText,发现它继承自EditText,直接在这个类中搜索 nRk.getText 的相关调用,很容易找到调用位置。




4、进行hook


try {
final Class<?> SnsUploadUIClass = cl.loadClass("com.tencent.mm.plugin.sns.ui.SnsUploadUI");
XposedHelpers.findAndHookMethod(SnsUploadUIClass, "onCreate", Bundle.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Object oSnsUploadUI = param.thisObject;
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsUploadUI$5$1",
mlpparam.classLoader, "pO", String.class,new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
//获取SnsUploadUIClass中的nRk变量
Object nRk=XposedHelpers.findField(SnsUploadUIClass, "nRk").get(oSnsUploadUI);

//方法1
//强转为EditText
EditText editText = (EditText) nRk;
//得到发表朋友圈的文本
String text=editText.getText().toString();

//方法2
//执行getText().toString()得到发表朋友圈的文本
String text= XposedHelpers.callMethod(nRk,"getText").toString();

//todo上传数据
}
});
}
});
} catch (Exception e) {
e.printStackTrace();
}


因为源码上有SnsUploadUI.this.nRk.setText("");这段,所以要在beforeHookedMethod中拦截。


方法1是因为
SnsEditText继承自EditText的,所以通过findField后直接强转成EditText,然后再获取字符串。


方法2是如果不知道SnsEditText是怎样的类的话,但我们知道nRk通过nRk.getText().toString()得到了文本信息,可以通过
XposedHelpers.callMethod得到。

需要说明的是
beforeHookedMethod主要是截取方法参数,afterHookedMethod主要截取方法返回值,如果一个变量在方法中值被改变了,那就看你是要改变前的还是改变后的了。

至此拦截成功,使用
Toast显示了一下。




以上代码使用了xposedfindAndHookMethodfindFieldcallMethod等方法,相对全面系统。当然还有callStaticMethodfindAndHookConstructor等常用方法,最好查看Xposed Api文档进行学习,多多使用。


使用xposed,最难的可能就是找到hook点,一般对于微信这种大量依赖数据库的,要么找到数据解析方法来拦截,要么找到数据入库或者查询操作自己解析判断来拦截。


如果一开始无处下手,可以先找到它的数据库相关
insert、updatedelete、query操作,这样就可以通过打印的sql查询方法知道它每个页面查的是哪个数据表,然后分析数据表的结构和字段含义,再找到执行页面进行代码分析。






- End -




看雪ID:JovenHe 

https://bbs.pediy.com/user-816443.htm  



本文由看雪论坛JovenHe 原创

转载请注明来自看雪社区



10大议题正式公布!第三届看雪安全开发者重磅来袭!





现在购买即可享受 2.5折 优惠!


—▼—



往期热门回顾

1、D-Link DIR 645 远程命令执行漏洞

2、如何实现 Https拦截进行 非常规“抓包”

3、稳定多线程中的inline hook

4、firefox 曝出0day,请尽快更新








公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com



点击阅读原文,查看更多干货!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存